1. 在模型类中重写 save() 方法的说明
- 在 django 的模型类里,如果有些字段的值是需要动态生成的,那么就在模型类里添加上对应的字段,并重写save方法,在 save() 方法中对该字段进行赋值
2. 什么情况会触发 save() 方法
- 使用添加所修改数据的时候使用 .save() 方法
- 使用在添加数据的时候使用 .create() 方法
- 使用 .update_or_create() 方法
3. 通过重写 save() 方法动态生成字段的值的写法
# models.py
class Book(models.Model):
name = models.CharField(max_length=10)
price = models.FloatField()
author = models.CharField(max_length=10)
publishing_house = models.CharField(max_length=10)
def save(self, *args, **kwargs):
self.author = 'Kevin'
self.publishing_house = '东莞出版社'
super(self.__class__, self).save(*args, **kwargs) # 调用父类的 save() 方法
# 会触发 save() 方法的情况
Book.objects.create(name='三国演义', price=98.5)
# -----------------------------------------------
book = Book.objects.filter(pk=1).first()
book.name = '西游记'
book.save()
# -----------------------------------------------
book = Book(name='水浒传', price=100)
book.save()
# -----------------------------------------------
Book.objects.update_or_create(name='三国演义', defaults={'price': 99.9})
4. 动态生成字段值的例子
- 通过用户名生成对应的 uid
# models.py
class Student(models.Model):
name = models.CharField(max_length=10)
age = models.IntegerField()
uid = models.CharField(verbose_name='个人唯一ID', max_length=64, unique=True, null=True) # unique 唯一索引
def save(self, *args, **kwargs):
if self.name:
m = hashlib.md5()
m.update(self.name.encode(encoding="utf-8"))
self.uid = m.hexdigest() # 生成一个 uid 字段的值
print(self.uid) # 17beaf58d14cbb17877dfb328452dc2d
super(self.__class__, self).save(*args, **kwargs) # 调用父类的save()方法
← ORM-分组查询 ORM-外键(一对多) →